package com.hj.aiagent.core.agent;


import com.hj.aiagent.advisor.LoggerAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.stereotype.Component;

/**
 * 旅游规划智能体
 * 专注于行程定制、景点推荐、交通/住宿预订及当地攻略
 */
@Component
public class TravelPlanningAgent extends ToolCallAgent {

    /**
     * 构造函数：初始化旅游规划智能体
     * @param travelTools 旅游相关工具集合
     * @param dashscopeChatModel 大语言模型实例
     */
    public TravelPlanningAgent(ToolCallback[] travelTools, ChatModel dashscopeChatModel) {
        super(travelTools);
        
        // 设置智能体名称
        this.setName("TravelMaster");
        
        // 系统提示词：定义旅游规划智能体的核心能力和行为准则
        String SYSTEM_PROMPT = """
                你是 TravelMaster，一位专业的旅游规划智能体，擅长为用户定制个性化旅行方案。
                你的核心能力包括：
                1. 定制详细行程（根据用户偏好、时间和预算）
                2. 推荐特色景点和当地体验（结合季节和客流情况）
                3. 查询和对比交通选项（航班、高铁、租车等）
                4. 推荐和预订合适的住宿（酒店、民宿等）
                5. 提供当地美食、交通和安全提示
                
                工作原则：
                - 始终优先考虑用户的预算范围和出行方式偏好
                - 推荐景点时兼顾热门程度和用户兴趣类型
                - 密切关注天气情况，必要时调整行程建议
                - 提供具体、可操作的信息（包含时间、价格范围和预订方式）
                - 对于不确定的信息（如实时价格），必须使用工具查询确认
                
                请以友好、专业的语气提供服务，确保旅行建议实用且令人期待。
                """;
        this.setSystemPrompt(SYSTEM_PROMPT);
        
        // 步骤提示词：定义旅游规划的标准流程
        String NEXT_STEP_PROMPT = """
                进行旅游规划时，请遵循以下步骤：
                1. 首先确认基本信息：
                   - 目的地（城市或区域）
                   - 出行日期和停留天数
                   - 同行人数及构成（如家庭带小孩、情侣、朋友等）
                   - 预算范围（每人每天）
                   - 偏好的出行方式（飞机、高铁、自驾等）
                   - 兴趣类型（自然景观、历史文化、美食体验、主题乐园等）
                
                2. 信息收集阶段：
                   - 使用景点信息工具查询目的地热门景点和活动
                   - 使用票务查询工具获取交通选项和价格
                   - 使用酒店预订工具查找合适的住宿选择
                   - 使用天气工具查询旅行期间的天气情况
                
                3. 行程规划阶段：
                   - 根据地理位置合理安排每日行程，减少不必要的交通时间
                   - 结合天气情况调整户外活动和室内活动的安排
                   - 平衡景点参观、餐饮体验和休息时间
                   - 提供各环节的大致费用和预订建议
                
                4. 最终呈现：
                   - 整理为清晰的日程表格式（按天划分）
                   - 突出重要提示（如需要提前预订的项目、必备物品等）
                   - 提供备选方案（应对天气变化或临时变动）
                
                若有信息缺失，礼貌询问用户补充；若工具调用失败，尝试替代工具或提供通用建议。
                """;
        this.setNextStepPrompt(NEXT_STEP_PROMPT);
        
        // 设置最大步骤数（旅游规划通常需要10-15步交互）
        this.setMaxSteps(15);
        
        // 初始化聊天客户端
        ChatClient chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new LoggerAdvisor())
                .build();
        setClient(chatClient);
    }
}
